Je cherche depuis quelque temps déjà, une alternative à l’éternel PHP (qui selon moi n’est pas bien fameux) pour développer des applications web. Sachant que j’adore le langage de programmation Lua, j’ai voulu voir si ces deux choses n’étaient pas incompatibles. C’est là que je suis tombé sur le projet Kepler. Après quelques installations foireuses du projet avec leur outil (LuaRocks), j’ai décidé de l’empaqueter pour Frugalware.
Avant de parler de Kepler, je vais tout d’abord vous présenter le langage de programmation Lua que j’affectionne tellement.
Lua a été créé en 1993 par Roberto IERUSALIMSCHY, Luiz Henrique de Figueiredo et Waldemar CELES alors qu’ils avaient besoin d’un langage pour scripter un de leur programme.
Il est écrit en C dans sa norme ANSI, ce qui lui assure une énorme portabilité, le C ANSI étant implémenté dans la majorité des systèmes (on retrouve Lua sur les architectures x86, x86_64, ARM, MIPS… Mais aussi sur la DS de Nintendo ou la PSP de Sony).
Le Lua est aussi très performant, a une emprunte mémoire très faible et ne pèse qu’une centaine de kilo octets. C’est aussi un langage simple, à la portée de tous, et multi-paradigme (impératif, prototype, événementiel, et j’en passe…).
Dans les grandes lignes, le projet Kepler est un projet créé dans le but de, je cite : « Faire de Lua une option viable pour le développement d’applications web. ».
Le projet Kepler est un ensemble de bibliothèques logicielles écrites en pur Lua la plupart du temps.
Les plus importantes sont :
C’est sans doute la partie la plus importante du projet Kepler, cette bibliothèque permet de faire le lien entre une application en Lua et un serveur web, soit par CGI, soit par FastCGI, soit implémenté directement dans le serveur web.
Cette bibliothèque offre toutes les fonctionnalités de base pour discuter avec le serveur web (échappement des URL, récupération des données POST, gestion des réponses…), elle est bas niveau et n’est pas très adaptée pour développer directement son application mais plutôt pour servir de base à la création de frameworks.
Vous pouvez l’installer à l’aide de la commande :
pacman-g2 -S wsapi
Cette bibliothèque permet de faciliter la création de « programmes serveur ». Elle se base sur les coroutines offertes par Lua et sur la bibliothèque externe LuaSocket (pour la gestion de la pile TCP/IP). Elle créé un lien entre un socket et une fonction qui sera appelée à chaque évènement du socket. En gros, elle permet de faciliter et d’accélérer la création de programmes serveur.
Pour l’installer :
pacman-g2 -S copas
Xavante est le rassemblement des deux bibliothèques précédentes : c’est en fait un serveur HTTP utilisant Copas pour la gestion réseau et WSAPI pour la partie HTTP.
Comme Xavante se présente sous la forme d’une bibliothèque, il est très simple de l’intégrer dans un programme pour que celui-ci devienne un serveur HTTP pour l’application, ou bien de le faire tourner comme un serveur HTTP classique.
Commande d’installation :
pacman-g2 -S xavante
Orbit est un framework écrit au dessus de WSAPI permettant de simplifier l’écriture des applications web. N’ayant pas trouvé d’archive de la dernière version, je ne l’ai pas empaqueté. Je ne m’y suis pas trop intéressé à cause de sa trop grande dépendance aux bases de donnée SQL et de sa lourdeur relative.
Mercury est framework (au même titre que Orbit) léger et agréable, ne faisant pas partie du projet Kepler mais qui se base aussi sur WSAPI. Il ne fait que 324 lignes et pèse environ 10Ko, le tout dans un unique fichier. Vous pouvez le récupérer ici.
Voici un exemple que j’ai réalisé avec ce framework : http://japprouve.upyum.com (sur modèle de http://jeproteste.info/, qui lui est en PHP).
Et son code source :
require "mercury" -- On charge la bibliothèque Mercury module("japprouve", package.seeall, mercury.application) -- On déclare notre application local conjugaison = require "conjugaisons" local easter_eggs = require "easter_eggs" local response_bones = [[ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>J'approuve.</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style type="text/css"> body { background: black; color: white; font-size: 400%%; text-align: center; margin-top:10%%; } </style> </head> <body> <h1>%s</h1> </body> </html> ]] get("/", function() -- Cette fonction sera exécutée lors d’un chargement de la page principale return response_bones:format(conjugaison[math.random(#conjugaison)]) end) get("/:appro", function() -- Celle-ci lors d’un chargement de page « /whatever » local appro = easter_eggs[params.appro:lower()] or params.appro; return response_bones:format("J’approuve " .. appro); end)
Il est aussi tout à fait possible de faire tourner directement cet exemple en utilisant Xavante, il suffit de rajouter quelques lignes, ce qui donne au final :
require "xavante" -- On charge la bibliothèque Xavante… require "wsapi.xavante" -- …et son interface WSAPI require "mercury" module("japprouve", package.seeall, mercury.application) local conjugaison = require "conjugaisons" local easter_eggs = require "easter_eggs" local response_bones = [[ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>J'approuve.</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style type="text/css"> body { background: black; color: white; font-size: 400%%; text-align: center; margin-top:10%%; } </style> </head> <body> <h1>%s</h1> </body> </html> ]] get("/", function() return response_bones:format(conjugaison[math.random(#conjugaison)]) end) get("/:appro", function() local appro = easter_eggs[params.appro:lower()] or params.appro; return response_bones:format("J’approuve " .. appro); end) xavante.HTTP{ -- On configure le serveur HTTP… server = { host = "127.0.0.1", port = 8081 }, defaultHost = { rules = { { match = { "^/(.-)$" }, with = wsapi.xavante.makeHandler(japprouve); }, } } }; xavante.start(); -- …et on le lance. :)
Si vous utilisez Xavante, il devient très simple de lancer son application web, une simple commande de ce type est suffisante :
lua japprouve.lua
Lua a donc un certain potentiel dans le développement web, qui a bien été mis en valeur par le projet Kepler et je compte faire quelques projets avec Yakulu afin de me débarrasser de PHP (tartine, hébergement d’images, de fichiers, gestionnaire de projets…).
Si vous voulez commenter ce billet, n’hésitez pas à m’envoyer un mail ou à m’envoyer un petit message sur Jabber, les commentaires seront ajoutés à l’article. (L’adresses est : kooda \at/ upyum.com)